import fase
import player
import pygame
from pygame.locals import *
from sys import exit
import os
from fase import *
import bomba
from monstro import *
from datetime import datetime
import random
from bonus import *
import vencedor
import Menu_principal

def muda_matriz(mapa,alcance,pos_bomba,status,bomba):
    lista_indices = []
    lista_rects = []
    pontos_player1 = 0
    pontos_player2 = 0
    x,y = pos_bomba[0],pos_bomba[1]
    cima,baixo,direita,esquerda = True,True,True,True
    lista_indices.append(((x,y),(bomba,'centro')))
    for i in range(1,alcance+1):
            #verifica parte de cima
            try:
                if mapa[x-i][y] == 1:
                    cima = False
                elif mapa[x-i][y] == 'rm' and cima:
                    lista_indices.append(((x-i,y),'cima_extremo_rm'))
                    lista_rects.append  (pygame.Rect((x-i)*42, (y)*42, 42, 42))
                    cima = False
                    if bomba.id_player == 1:
                        pontos_player1 += 5
                    else:
                        pontos_player2 += 5
                elif str(type(mapa[x-i][y])) == "<type 'instance'>" and cima:
                    mapa[x-i][y].status = 'explodindo'
                    cima = False
                        
                elif cima:
                    if i == alcance:
                        lista_indices.append(((x-i,y),'cima_extremo'))
                        lista_rects.append(pygame.Rect((x-i)*42, (y)*42, 42, 42))
                    else:
                        lista_indices.append(((x-i,y),'cima'))
                        lista_rects.append(pygame.Rect((x-i)*42, (y)*42, 42, 42))
            except:
                pass

            #verifica baixo
            try:
                if mapa[x+i][y] == 1:
                    baixo = False
                elif mapa[x+i][y] == 'rm' and baixo:
                    lista_indices.append(((x+i,y),'baixo_extremo'))
                    lista_rects.append(pygame.Rect((x+i)*42, (y)*42, 42, 42))
                    baixo = False
                    if bomba.id_player == 1:
                        pontos_player1 += 5
                    else:
                        pontos_player2 += 5
                elif str(type(mapa[x+i][y])) == "<type 'instance'>" and baixo:
                    mapa[x+i][y].status = 'explodindo'
                    baixo = False
                elif baixo:
                    if i == alcance:
                        lista_indices.append(((x+i,y),'baixo_extremo'))
                        lista_rects.append(pygame.Rect((x+i)*42, (y)*42, 42, 42))
                    else:
                        lista_indices.append(((x+i,y),'baixo'))
                        lista_rects.append(pygame.Rect((x+i)*42, (y)*42, 42, 42))
                    
            except:
                pass
            
           
            
                    

            #verifica direita
            try:
                if mapa[x][y+i] == 1:
                    direita = False
                elif mapa[x][y+i] == 'rm' and direita:
                    lista_indices.append(((x,y+i),'direito_extremo_rm'))
                    lista_rects.append(pygame.Rect((x)*42, (y+i)*42, 42, 42))
                    direita = False
                    if bomba.id_player == 1:
                        pontos_player1 += 5
                    else:
                        pontos_player2 += 5
                elif str(type(mapa[x][y+i])) == "<type 'instance'>" and direita:
                    mapa[x][y+i].status = 'explodindo'
                    direita = False
                elif direita:
                    if i == alcance:
                        lista_indices.append(((x,y+i),'direito_extremo'))
                        lista_rects.append(pygame.Rect((x)*42, (y+i)*42, 42, 42))
                    else:
                        lista_indices.append(((x,y+i),'direito'))
                        lista_rects.append(pygame.Rect((x)*42, (y+i)*42, 42, 42))
            except:
                pass

            #verifica esquerda
            linha = x
            coluna = y-i
            try:
                
                if mapa[x][y-i] == 1:
                    esquerda = False
                elif mapa[x][y-i] == 'rm' and esquerda:
                    lista_indices.append(((x,y-i),'esquerdo_extremo_rm'))
                    lista_rects.append(pygame.Rect((x)*42, (y-i)*42, 42, 42))
                    esquerda = False
                    if bomba.id_player == 1:
                        pontos_player1 += 5
                    else:
                        pontos_player2 += 5
                elif str(type(mapa[x][y-i])) == "<type 'instance'>" and esquerda:
                    mapa[x][y-i].status = 'explodindo'
                    esquerda = False
                elif esquerda:
                    if i == alcance:
                        lista_indices.append(((x,y-i),'esquerdo_extremo'))
                        lista_rects.append(pygame.Rect((x)*42, (y-i)*42, 42, 42))
                    else:
                        
                        if mapa[x][y-i] == "centro":
                            lista_indices.append(((x,y-i),'centro'))
                        else:
                            lista_indices.append(((x,y-i),'esquerdo'))
                        lista_rects.append(pygame.Rect((x)*42, (y-i)*42, 42, 42))
            except:
                pass
    
    tipos_bonus = ["esquerdo_extremo_rm","direito_extremo_rm","cima_extremo_rm","baixo_extremo_rm"]
    if status == 'explodindo':
        for indice in lista_indices:
            i,j = indice[0]
            mapa[i][j] = indice[1]
    else:
        for linha in range(15):
            for coluna in range(18):
                if mapa[linha][coluna] == 1 or mapa[linha][coluna] == "rm" or  str(type(mapa[linha][coluna])) == "<type 'instance'>" or mapa[linha][coluna]== "p1"\
                   or mapa[linha][coluna]== "p2" or mapa[linha][coluna]== "lp1" or mapa[linha][coluna]== "lp2" or mapa[linha][coluna]== "time" or mapa[linha][coluna]==  "sp1" or mapa[linha][coluna]== "sp2":
                    pass
                        
                elif mapa[linha][coluna] in tipos_bonus:
                    bonus = random.randint(0,12)
                    if bonus in [3,5,7,11]:
                        mapa[linha][coluna] = Bonus(bonus,datetime.now())
                    else:
                        mapa[linha][coluna] = 0
                else:
                    mapa[linha][coluna] = 0
                    
    return pontos_player1,pontos_player2       
    


def carrega_fase(tela,mapa,matriz,player1,player2,minutos,segundos,cor):
    font = pygame.font.Font("fontes" + os.sep + "chonker.ttf", 25, bold = True)
    font2 = pygame.font.Font("fontes" + os.sep + "chonker.ttf", 18, bold = True)
    tempo = font.render("%d:%02d"%(minutos,segundos), False, cor)
    score1 = font2.render("Score:%06d"%(player1.pontos),False,(0,0,0))
    score2 = font2.render("Score:%06d"%(player2.pontos),False,(0,0,0))
    destrutivel = mapa.getImagemDestrutivel()
    matriz = mapa.getMatriz()
    fundo = mapa.fundo
    direita = pygame.image.load("img"+os.sep+"cenario"+os.sep+"direita.png").convert_alpha()
    esquerda = pygame.image.load("img"+os.sep+"cenario"+os.sep+"esquerda.png").convert_alpha()
    cima = pygame.image.load("img"+os.sep+"cenario"+os.sep+"cima.png").convert_alpha()
    baixo = pygame.image.load("img"+os.sep+"cenario"+os.sep+"baixo.png").convert_alpha()
    horizontal = pygame.image.load("img"+os.sep+"cenario"+os.sep+"horizontal.png").convert_alpha()
    vertical = pygame.image.load("img"+os.sep+"cenario"+os.sep+"vertical.png").convert_alpha()
    centro = pygame.image.load("img"+os.sep+"cenario"+os.sep+"centro.png").convert_alpha()
    pontos_player1 = 0
    pontos_player2 = 0
    lista_paredes = []
    lista_bombas = []
    lista_destrutiveis = []
    lista_fogo = []
    lista_bonus = []
    tela.blit(fundo,(0,0))
    cont = 0
    for linha in xrange(15):
        for coluna in xrange(18):
            posicao = ((coluna)*42,(linha)*42)
            #60,50
            elemento = matriz[linha][coluna]
            if str(type(elemento)) != "<type 'instance'>":
				   
                 
                if elemento == 1:
		    lista_paredes.append((pygame.Rect((coluna)*42, (linha)*42, 42, 42)))
		    #pygame.draw.rect(tela,(255,255,0),pygame.Rect((coluna)*42, (linha)*42, 42, 42))
                elif elemento == 'rm':
		    tela.blit(destrutivel,posicao)
		    lista_destrutiveis.append((pygame.Rect((coluna)*42, (linha)*42, 42, 42)))
		    #pass

                elif elemento == 'cima' or elemento == 'baixo':
                    tela.blit(vertical,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'cima_extremo' or elemento == "cima_extremo_rm" :
                    tela.blit(cima,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                    if elemento == "cima_extremo_rm":
                        pass
                elif elemento == 'baixo_extremo' or elemento == "baixo_extremo_rm":
                    tela.blit(baixo,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
		elif elemento == 'direito' or elemento =='esquerdo':
                    tela.blit(horizontal,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'cima' or elemento == 'baixo':
                    tela.blit(vertical,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'direito_extremo' or elemento == "direito_extremo_rm":
                    tela.blit(direita,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'esquerdo_extremo' or elemento == "esquerdo_extremo_rm":
                    tela.blit(esquerda,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == "p1":
                    tela.blit(pygame.image.load("img"+ os.sep + "cenario"+ os.sep + "back_player1.png"),posicao)
                    tela.blit(player1.imagem_display,posicao)
                elif elemento == "p2":
                    tela.blit(pygame.image.load("img"+ os.sep + "cenario"+ os.sep + "back_player2.png"),posicao)
                    tela.blit(player2.imagem_display,posicao)
                elif elemento == "lp1":
                    x,y = posicao[0]-20,posicao[1]
                    for i in range(player1.vidas):
                        x += 20
                        tela.blit(pygame.image.load("img"+ os.sep + "cenario"+ os.sep + "life.png"),(x,y))
                elif elemento == "lp2":
                    x,y = posicao[0]-20,posicao[1]
                    for i in range(player2.vidas):
                        x += 20
                        tela.blit(pygame.image.load("img"+ os.sep + "cenario"+ os.sep + "life.png"),(x,y))
                elif elemento == "time":
                    tela.blit(tempo,posicao)
                elif elemento == "sp1":
                     tela.blit(score1,posicao)
                elif elemento == "sp2":
                     tela.blit(score2,posicao)
                        
                elif type(elemento) == tuple:
                    tela.blit(centro,posicao)
                    elemento[0].verifica_tempo(datetime.now(),posicao,tela,matriz)
                    if elemento[0].status == "explodiu":
                        muda_matriz(matriz,elemento[0].potencia,(linha,coluna),"explodiu",elemento)
                        #lista_fogo = []
                    else:
                        lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                        
                
            else:
                if elemento.tipo_objeto() == "bomba":
                    if elemento.status == 'ativa':
                        elemento.verifica_tempo(datetime.now(),posicao,tela,matriz)
                        lista_bombas.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                    elif elemento.status == "explodindo":
                        pontos_player1,pontos_player2 = muda_matriz(matriz,elemento.potencia,(linha,coluna),"explodindo",elemento)
                        elemento.verifica_tempo(datetime.now(),posicao,tela,matriz)
                elif elemento.tipo_objeto() == "bonus":
                    verifica = elemento.verifica_tempo()
                    if verifica:
                        tela.blit(elemento.getImagem(),posicao)
                        lista_bonus.append((pygame.Rect(posicao[0], posicao[1], 42, 42),elemento.tipo_bonus,(linha,coluna)))
                    else:
                        matriz[linha][coluna] = 0
                        
                
                    
            
            
             
    
    
    return lista_paredes,lista_bombas,lista_destrutiveis,lista_fogo,lista_bonus,pontos_player1,pontos_player2
    
    


def Executa(personagem1,personagem2,opcao_fase):
    width, height = 798,672
    pygame.init()
    tela = pygame.display.set_mode((width,height), 0, 32)
    pygame.display.set_caption("MegaBomb")
    mapa = fase.Mapa(opcao_fase)
    pygame.mixer.music.load("img" + os.sep + "cenario" +os.sep+mapa.getFase()+os.sep +"som.mid")
    pygame.mixer.music.play(-1)
    tocando = True
    #som_fase.set_volume(1.0)
    #som_fase.play()
    
    tempo_inicio = datetime.now()
    min_inicio = tempo_inicio.minute
    sec_inicio = tempo_inicio.second
    inicio_total = min_inicio*60 + sec_inicio
    tempo_jogo = 120
    
    char1 = player.Player(personagem1,1,96,152,1)
    char2 = player.Player(personagem2,0,672,524,2)
    
    
    bomb = bomba.Bomba()
    matriz = mapa.getMatriz()
    sair = False
    img_sair = pygame.image.load("img"+os.sep+"cenario"+os.sep+"sair.png").convert_alpha()

    while True:
        tempo_agora = datetime.now()
        minuto_agora = tempo_agora.minute
        segundo_agora = tempo_agora.second
        total_agora = minuto_agora*60 + segundo_agora

        minutos = (tempo_jogo - (total_agora - inicio_total)) / 60
        segundos = (tempo_jogo - (total_agora - inicio_total)) % 60
        
        
        #print subtracao_segundos
        if (tempo_jogo - (total_agora - inicio_total)) > 30:
            cor = (0,0,255)
        else:
            cor = (255,0,0)
        
        for event in pygame.event.get():
            if event.type == QUIT:
                exit(0)

        
        botao_pressionado = pygame.key.get_pressed()
        lista_rects,lista_bombas,lista_destrutiveis,lista_fogo,lista_bonus,pontos_p1,pontos_p2 = carrega_fase(tela,mapa,matriz,char1,char2,minutos,segundos,cor) 

        char1.pontos += pontos_p1
        char2.pontos += pontos_p2
        #verifica dano
        for fogo in lista_fogo:
            verifica1 = char1.verificaPlayer()
            if char1.rectPlayer.colliderect(fogo) and verifica1:
                char1.morrer(datetime.now())
                char2.pontos += 100
            verifica2 = char2.verificaPlayer()
            if char2.rectPlayer.colliderect(fogo) and verifica2:
                char2.morrer(datetime.now())
                char1.pontos += 100
        #verifica bonus
        for bonus in lista_bonus:
            if char1.rectPlayer.colliderect(bonus[0]):
                if bonus[1] == "speed":
                    char1.speed += 1
                elif bonus[1] == "bomba":
                    char1.qntidade_bombas += 1
                elif bonus[1] == "potencia":
                    char1.potencia += 1
                elif bonus[1] == "vida":
                    char1.vidas += 1
                i,j = bonus[2]
                matriz[i][j] = 0
                som_bonus = pygame.mixer.Sound("sounds" + os.sep + "item_pickup.wav")
                som_bonus.play()
                char1.pontos += 10

            if char2.rectPlayer.colliderect(bonus[0]):
                if bonus[1] == "speed":
                    char2.speed += 1
                elif bonus[1] == "bomba":
                    char2.qntidade_bombas += 1
                elif bonus[1] == "potencia":
                    char2.potencia += 1
                elif bonus[1] == "vida":
                    char2.vidas += 1
                i,j = bonus[2]
                matriz[i][j] = 0
                som_bonus = pygame.mixer.Sound("sounds" + os.sep + "item_pickup.wav")
                som_bonus.play()
                char2.pontos += 10
                
            

        char1_verifica = char1.verificaPlayer()
        char2_verifica = char2.verificaPlayer()
                
            
            
            
        

        
        character1 = char1.parado()
        char1_indice_x = (char1.getRectPosic().x) / 42
        char1_indice_y = (char1.getRectPosic().y) / 42
        
        character2 = char2.parado()
        char2_indice_x = (char2.getRectPosic().x) / 42
        char2_indice_y = (char2.getRectPosic().y) / 42
        
        if botao_pressionado[K_h]:
            if tocando:
                pygame.mixer.music.stop()
                tocando = False
            else:
                pygame.mixer.music.play(-1)
                tocando = True
            pygame.time.delay(50)

        if botao_pressionado[K_ESCAPE]:
            #botao_pressionado[K_ESCAPE] = False
            sair = True
                  
                

        

        if char1_verifica:
            #movimento player 1
            if botao_pressionado[K_UP]:
                char1.setDirecao(0)
                character1 = char1.imagem()
                char1.mudaEstado()
                char1.mover(0, -char1.speed,lista_rects,lista_bombas,lista_destrutiveis)
                            
            elif botao_pressionado[K_DOWN]:
                char1.direcao = 1
                character1 = char1.imagem()
                char1.mudaEstado()
                char1.mover(0, char1.speed,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_RIGHT]:
                char1.direcao = 2
                character1 = char1.imagem()
                char1.mudaEstado()
                char1.mover(char1.speed, 0,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_LEFT]:
                char1.setDirecao(3)
                character1 = char1.imagem()
                char1.mudaEstado()
                char1.mover(-char1.speed, 0,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_RETURN]:
                char1.verifica_bombas()
                permicao = char1.permite_bomba()
                if str(type(mapa.estrutura1[char1_indice_y][char1_indice_x])) != "<type 'instance'>" and permicao:
                    mapa.setMatriz(char1_indice_y,char1_indice_x,bomba.Bomba(datetime.now(),(char1_indice_y,char1_indice_x),char1.potencia,char1.id_player))
                    char1.soltaBomba(datetime.now())
            else:
                pass


        if char2_verifica:
            #movimentos player 2
            if botao_pressionado[K_w]:
                char2.setDirecao(0)
                character2 = char2.imagem()
                char2.mudaEstado()
                char2.mover(0, -char2.speed,lista_rects,lista_bombas,lista_destrutiveis)
                            
            elif botao_pressionado[K_s]:
                char2.direcao = 1
                character2 = char2.imagem()
                char2.mudaEstado()
                char2.mover(0, char2.speed,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_d]:
                char2.direcao = 2
                character2 = char2.imagem()
                char2.mudaEstado()
                char2.mover(char2.speed, 0,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_a]:
                char2.setDirecao(3)
                character2 = char2.imagem()
                char2.mudaEstado()
                char2.mover(-char2.speed, 0,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_SPACE]:
                char2.verifica_bombas()
                permicao = char2.permite_bomba()
                if str(type(mapa.estrutura1[char2_indice_y][char2_indice_x])) != "<type 'instance'>" and permicao:
                    mapa.setMatriz(char2_indice_y,char2_indice_x,bomba.Bomba(datetime.now(),(char2_indice_y,char2_indice_x),char2.potencia,char2.id_player))
                    char2.soltaBomba(datetime.now())
            else:
                pass
        if (tempo_jogo - (total_agora - inicio_total)) > 0:
            if char1.vidas < 0 or char2.vidas < 0:
                if char1.vidas < 0 and char2.vidas >= 0:
                    vencedor.executa(2,datetime.now(),char2.pontos+tempo_jogo*10)
                elif char2.vidas <0 and char1.vidas >=0:
                     vencedor.executa(1,datetime.now(),char1.pontos+tempo_jogo*10)
        else:
            if char1.pontos > char2.pontos:
                vencedor.executa(1,datetime.now(),char1.pontos)
            elif char2.pontos > char1.pontos:
                vencedor.executa(2,datetime.now(),char2.pontos)
            else:
                vencedor.executa(0,datetime.now(),char2.pontos)
        
        
        if char1.opcao == 1:
            tela.blit(character1,(char1.posicaox,char1.posicaoy-10))
        elif char1.opcao == 3:
            tela.blit(character1,(char1.posicaox,char1.posicaoy-20))
        else:
            tela.blit(character1,(char1.posicaox,char1.posicaoy))

        if char2.opcao == 1:
            tela.blit(character2,(char2.posicaox,char2.posicaoy-10))
        elif char2.opcao == 3:
            tela.blit(character2,(char2.posicaox,char2.posicaoy-20))
        else:
            tela.blit(character2,(char2.posicaox,char2.posicaoy))

        if sair and not botao_pressionado[K_ESCAPE]:
            tempo_pausou = datetime.now()
            pygame.mixer.music.stop()
            pygame.time.delay(100)
            minuto_pausou = tempo_pausou.minute
            sec_pausou = tempo_pausou.second
            while sair:
                for event in pygame.event.get():
                    if event.type == QUIT:
                        exit(0)
                botao_pressionado2 = pygame.key.get_pressed()
                tela.blit(img_sair,(width/2-125,height/2-62))
                pygame.display.update()
                if botao_pressionado2[K_RETURN]:
                    Menu_principal.main(0)
                if botao_pressionado2[K_ESCAPE]:
                    sair = False
                    pygame.time.delay(200)
                    tempo_saida = datetime.now()
                    minuto_saida = tempo_saida.minute - minuto_pausou
                    sec_saida = tempo_saida.second - sec_pausou
                    tempo_jogo += minuto_saida * 60 + sec_saida
                    print "saiu"
                    pygame.mixer.music.play(-1)
            
                
        
        #pygame.draw.rect(tela, (0, 255 , 0), char1.rectPlayer)
        #pygame.draw.rect(tela, (255, 0 , 0), char1.getRectPosic())
        #print char1.posicaox,char1.posicaoy
        pygame.display.flip()
        pygame.display.update()
    
